package com.ylyq.ylxx.model.request;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;

/**
 * @ClassName GetReportGroupRequest
 * @Description TODO
 * @Author xiaweichao
 * @Date 2020/7/7 16:48
 * @Version 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "获取广告组数据的请求参数")
public class GetReportGroupRequest {

    @ApiModelProperty(value = "广告主ID",required = true)
    @NotNull(message = "广告主ID不能为空")
    private Long advertiser_id;
    @ApiModelProperty(value = "起始日期,格式YYYY-MM-DD,只支持查询2016-10-26及以后的日期",required = true)
    @NotNull(message = "起始日期不能为空")
    private String start_date;
    @ApiModelProperty(value = "结束日期,格式YYYY-MM-DD,只支持查询2016-10-26及以后的日期\n" +
            "- 对于搜索词报表，只支持查看最近 30 天的数据;\n" +
            "- 对于关键词报表，只支持查看 2019-05-19 之后的数据",required = true)
    @NotNull(message = "结束日期不能为空")
    private String end_date;

    @ApiModelProperty(value = "页数默认值: 1")
    private Integer page;

    @ApiModelProperty(value = "页面大小默认值: 10")
    private Integer page_size;
    @ApiModelProperty(value = "分组条件，默认为STAT_GROUP_BY_FIELD_STAT_TIME。详见【附录-分组条件】。\n" +
            "分组条件分为三种：时间类型：STAT_GROUP_BY_FIELD_STAT_TIME， ID 类型：STAT_GROUP_BY_FIELD_ID，细分维度类型：STAT_GROUP_BY_INVENTORY等。您可以同时选择多个分组条件，但是每种类型最多只能选择一个。假设一次查询中共有m个id，n个时间，有以下三种情况：①group_by=[\"STAT_GROUP_BY_FIELD_STAT_TIME\"]表示数据按照时间聚合，即本次返回最多为n个数据，表示将m个id的数据根据n个时间各自累计，因此返回中没有相应的id。②group_by=[\"STAT_GROUP_BY_FIELD_ID\"]表示按照id聚合，本次返回最多返回m条数据，即将n天的数据按照m个id各自累加。③group_by=[\"STAT_GROUP_BY_FIELD_ID\", \"STAT_GROUP_BY_FIELD_STAT_TIME\"]表示按照时间和id同时聚合，最多返回m * n个数据，返回数据中会同时存在id和时间。同理如果group_by=[\"STAT_GROUP_BY_FIELD_ID\", \"STAT_GROUP_BY_FIELD_STAT_TIME\",\"STAT_GROUP_BY_INVENTORY\"]表示按照时间、id和广告位（或者其他细分维度）同时聚合。")
    private String[] group_by;
    @ApiModelProperty(value = "时间粒度, 当分组为\"STAT_GROUP_BY_FIELD_ID\"无效。 \"STAT_TIME_GRANULARITY_DAILY\"表示天, \"STAT_TIME_GRANULARITY_HOURLY\"表示小时。默认值: STAT_TIME_GRANULARITY_DAILY。允许值:\"STAT_TIME_GRANULARITY_DAILY\",\"STAT_TIME_GRANULARITY_HOURLY\"")
    private String time_granularity;
    @ApiModelProperty(value = "排序字段，所有的统计指标均可参与排序")
    private String order_field;
    @ApiModelProperty(value = "排序方式；默认值: DESC；允许值: \"ASC\", \"DESC\"")
    private String order_type;

    @ApiModelProperty(value = "过滤条件，如果campaign_ids不填默认按照广告主过滤，支持字段如下")
    private FilteringGetReportGroupRequest filtering;

    @NoArgsConstructor
    @Data
    public static class FilteringGetReportGroupRequest {

        /**
         * advertiser_id : 12312321
         * advertiser_name : test_developer
         * advertiser_role : 1
         * is_valid : true
         */
        @ApiModelProperty(value = "按广告组 id 过滤")
        private Long[] campaign_ids;
        @ApiModelProperty(value = "按照campaign_name过滤")
        private String campaign_name;
        @ApiModelProperty(value = "\t按广告计划 id 过滤")
        private Long[] ad_ids;
        @ApiModelProperty(value = "按creative_id过滤")
        private Long[] creative_ids;
        @ApiModelProperty(value = "按照广告位置过滤，详见【附录-投放位置】")
        private String[] inventory_types;
        @ApiModelProperty(value = "按照出价方式过滤，详见【附录-计划出价类型】")
        private String[] pricings;
        @ApiModelProperty(value = "按照类型过滤，详见【附录-素材类型】")
        private String[] image_modes;
        @ApiModelProperty(value = "按照创意类型过滤，STATIC_ASSEMBLE 表示程序化创意，INTERVENE表示自定义创意")
        private String[] creative_material_modes;
        @ApiModelProperty(value = "按照素材id过滤")
        private Long[] material_ids;
        @ApiModelProperty(value = "按照广告组推广目的过滤")
        private String[] landing_types;
        @ApiModelProperty(value = "按照广告组状态过滤，默认为返回“所有不包含已删除”，如果要返回所有包含已删除有对应枚举表示，详见【附录-广告计划投放状态】")
        private String status;
    }
}
